#!/usr/bin/python3
'''
这个文件包含了需要的客户端需要的相关的qwidget，客户端页面小部件
有三个类：QFileItem QFilelistWidget ClientLogin
'''
import socket
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QLabel, QListWidget, QPushButton, \
                                QListWidgetItem, QHBoxLayout, QVBoxLayout, QMessageBox, QLineEdit, QInputDialog
from PyQt5.QtCore import QSize, Qt
import sys

# 文件项 Q表示这是Qwidget
class QFileItem(QWidget):
    '''
    这是文件夹（文件）的小部件
    '''
    def __init__(self, ftype, name):
        super(QFileItem, self).__init__()
        self.type = ftype # 文件类型
        self.name = name # 文件名称  
        self.initUI()

    def initUI(self):

        layout = QHBoxLayout()

        # 初始化标签和按钮
        self.typelabel = QLabel(self.type)
        self.filelabel = QLabel(self.name)
        self.share_button = QPushButton('分享')
        self.download_button = QPushButton('下载')
        self.delete_button = QPushButton('删除')
        
        # 关联函数 20211002关联由外面来做，这里不再有用
        #self.share_button.clicked.connect(self.share_file)
        #self.download_button.clicked.connect(self.download_file)
        #self.delete_button.clicked.connect(self.delete_file)

        # 添加至布局
        layout.addWidget(self.typelabel)
        layout.addWidget(self.filelabel)
        layout.addWidget(self.share_button)
        layout.addWidget(self.download_button)
        layout.addWidget(self.delete_button)
        self.setLayout(layout)


# 文件列表
class QFilelistWidget(QListWidget):
    '''
    这是文件列表
    要在内部维护self.file_list，作为当前current_file_list，而不应该由外部来维护这张表
    '''
    def __init__(self, file_list): # file_list是当前current_file_list，QFilelistWidget确实需要维护一个file表
        super(QFilelistWidget, self).__init__()
        self.file_list = file_list
        self.initUI()

    def initUI(self):
        # 可能是因为点击事件发生在i变化之后，所以总是显示最后一个item
        for i in range(0,len(self.file_list)):
            item = QListWidgetItem()
            item.setSizeHint(QSize(500,50)) # 必须要设置大小才能看到
            item_content = QFileItem(ftype=self.file_list[i].type, name=self.file_list[i].name)
            self.addItem(item)
            self.setItemWidget(item, item_content)

    def which_item(self):
        '''
        先要知道是哪个item上的按钮被按，这个函数和item上的按钮配合起来就能实现share、download、delete。
        why not print(self.currentItem())? for 选中item的内容不代表选中了item
        ''' 
        for i in range(0,self.count()):
            citem = self.item(i) # Returns the item that occupies the given row in the list if one has been set; 
            w = self.itemWidget(citem) # Returns the widget displayed in the given item.
            sender = w.sender().parentWidget() # 获得按钮后继续访问其父widget 得到item
            #print(sender)
            if w == sender:
                t = i
                break
        return t

    def delete_item(self, t):
        '''
        输入的是序号
        '''
        self.removeItemWidget(self.item(t)) # 先把所有widget删除，再删item
        self.takeItem(t)
        del self.file_list[t]

    def add_item(self, file):
        '''
        只由外部函数调用，添加之后都会返回添加的item
        '''
        item = QListWidgetItem()
        item.setSizeHint(QSize(500, 50))
        item_content = QFileItem(ftype=file.type, name=file.name)
        self.addItem(item)
        self.setItemWidget(item, item_content)
        self.file_list.append(file)
        return item

    def add_items(self, files):
        '''
        添加之后返回添加的items
        '''
        items = []
        for i in range(0, len(files)):
            item = self.add_item(files[i])
            items.append(item)
        return items

    def get_items(self):
        '''
        返回QFilelistWidget所有的item
        '''
        items = []
        for i in range(0,self.count()):
            item = self.item(i)
            items.append(item)
        return items

    def clear_items(self):
        '''
        只是清除item，并不会清理file_list
        '''
        for i in range(0,self.count()):
            self.removeItemWidget(self.item(i)) # 把所有的item上的widget删除 
        self.file_list.clear()
        self.clear() # 再clear


class ClientLogin(QWidget): # 登录界面
    '''
    这是客户端登录页面
    '''
    def __init__(self):
        super(ClientLogin, self).__init__()
        self.initUI()

    def initUI(self):
        # 初始化标签
        self.accountlabel = QLabel('账号')
        self.passwordlabel = QLabel('密码')

        # 初始化lineedit
        self.accountline = QLineEdit()
        self.passwordline = QLineEdit()

        # 初始化登录按钮
        self.loginbutton = QPushButton('登录')

        # 将widget添加进布局
        self.h1_layout = QHBoxLayout()
        self.h1_layout.addWidget(self.accountlabel)
        self.h1_layout.addWidget(self.accountline)

        self.h2_layout = QHBoxLayout()
        self.h2_layout.addWidget(self.passwordlabel)
        self.h2_layout.addWidget(self.passwordline)

        self.h3_layout = QHBoxLayout()
        self.h3_layout.addWidget(self.loginbutton)
        self.h3_layout.setAlignment(Qt.AlignCenter)

        self.layout = QVBoxLayout()
        self.layout.addStretch() # 添加填充
        self.layout.addLayout(self.h1_layout)
        self.layout.addStretch()
        self.layout.addLayout(self.h2_layout)
        self.layout.addStretch()
        self.layout.addLayout(self.h3_layout)
        self.layout.addStretch()
 
        self.setLayout(self.layout)
        self.resize(500, 300)
        self.show()
        
# if __name__=="__main__":
#     commu = Communication(('192.168.59.133', 8080))
#     app = QApplication(sys.argv)
#     p = ClientLogin(commu)
#     sys.exit(app.exec_())
    
